package com.ai.zhly.task;

import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import com.ai.dmc.index.common.bean.CommonBaseBean;
import com.ai.dmc.index.common.InitParam;
import com.ai.dmc.index.common.util.DateUtil;
import com.ai.zhly.service.IConvertService;

import net.sf.json.JSONObject;


/**
 * @Description : 判断基站是否在某区域内
 * 
 * @author : wucm
 * @date : 2015年8月28日 上午11:16:10
 * @version V1.0
 * 
 */
public class RegionMatchSiteTask{
	private static Logger logger = Logger.getLogger(RegionMatchSiteTask.class);
	private static boolean executeFlag = false;// 防止多次执行
	
	private IConvertService convertService;
	
	public IConvertService getConvertService() {
		return convertService;
	}

	public void setConvertService(IConvertService convertService) {
		this.convertService = convertService;
	}

	public void execute() {
		if (executeFlag) {
			return;
		}
		if(!InitParam.REGION_MATCH_SITE_FLAG){//如果未启用该定时任务，则退出
			return;
		}

		executeFlag = true;

		logger.debug("RegionMatchSiteTask任务开始时间："
				+ DateUtil.getInstance().getToday("yyyy-MM-dd hh:mm:ss"));

		// 区域与基站匹配
		RegionMatchSite();
		
		logger.debug("RegionMatchSiteTask任务结束时间："
				+ DateUtil.getInstance().getToday("yyyy-MM-dd hh:mm:ss"));
		executeFlag = false;
	}

	/**
	 *
	 * @Description : 区域与基站匹配
	 * 
	 * @return JSONObject
	 * 
	 * @author : heyl
	 * @date : 2016年10月13日 下午4:28:13
	 * 
	 */
	private void RegionMatchSite() {
		String regionId="";//区域ID
		String lat_lng_list="";//区域范围经纬度序列
		String lacci="";//基站ID
		String longitude="";//基站经度
		String latitude="";//基站纬度
		double lngMax=0;//经度最大值
		double lngMin=0;//经度最小值
		double latMax=0;//纬度最大值
		double latMin=0;//纬度最小值
		//获取需要处理的区域信息，每次取一条
		List<CommonBaseBean> dealRegion = convertService.queryDealRegionList();
		//区域ID
		regionId = dealRegion.get(0).getQuery_value1();
		//区域经纬度序列
		lat_lng_list = dealRegion.get(0).getQuery_value2();
		//获取最大经、纬度
		String getlist[] = lat_lng_list.split(";");
		int i=0;
		for (String str : getlist) {
			i++;
			if (str.split(",").length < 2) {
				continue;
			}
			String xStr = str.split(",")[0];
			String yStr = str.split(",")[1];
			double x = Double.valueOf(xStr);
			double y = Double.valueOf(yStr);
			if(i==1){//初始化
				lngMax=x;
				lngMin=x;
				latMax=y;
				latMin=y;
			}
			if(lngMax<x) {
				lngMax=x;
			}
			if(lngMin>x){
				lngMin=x;
			}
			if(latMax<y){
				latMax=y;
			}
			if(latMin>y){
				latMin=y;
			}			
		}
		String _lngMax=Double.toString(lngMax);
		String _lngMin=Double.toString(lngMin);
		String _latMax=Double.toString(latMax);
		String _latMin=Double.toString(latMin);
		
		//获取“矩形区域内”需要处理的基站lacci信息
		List<CommonBaseBean> lacciList = convertService.queryDealLacciList(_lngMax,_lngMin,_latMax,_latMin);		
		for(int j=0;j<lacciList.size();j++){
			lacci=lacciList.get(j).getQuery_value1();
			longitude=lacciList.get(j).getQuery_value2();
			latitude=lacciList.get(j).getQuery_value3();			
			if (checkByString(longitude, latitude, lat_lng_list)) {//如果基站在区域内					
				//保存区域与基站关系
				Map<String, String> m = new HashMap<String, String>();
				m.put("regionId", regionId);
				m.put("lacci", lacci);					
				convertService.saveRegionSiteRelation(m);
			}
		}
		//更新区域处理标识为“已处理”
		convertService.updateRegionStatus(regionId);
	}
	
	/**
	 * 传入string 判断点是否在区域内
	 * 
	 * @return
	 */
	private boolean checkByString(String lngStr, String latStr,
			String lngLatListStr) {
		try {
			double lng = Double.valueOf(lngStr);
			double lat = Double.valueOf(latStr);
			String list[] = lngLatListStr.split(";");
			Point2D.Double point = new Point2D.Double(lng, lat);
			List<Point2D.Double> polygon = new ArrayList<Point2D.Double>();
			for (String str : list) {
				if (str.split(",").length < 2) {
					continue;
				}
				String xStr = str.split(",")[0];
				String yStr = str.split(",")[1];
				double x = Double.valueOf(xStr);
				double y = Double.valueOf(yStr);
				Point2D.Double p = new Point2D.Double(x, y);
				polygon.add(p);
			}
			return (checkWithJdkGeneralPath(point, polygon));

		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 判断点是否在多边形内
	 * 
	 * @param point
	 * @param polygon
	 * @return
	 */
	public static boolean checkWithJdkGeneralPath(Point2D.Double point,
			List<Point2D.Double> polygon) {
		java.awt.geom.GeneralPath p = new java.awt.geom.GeneralPath();

		Point2D.Double first = polygon.get(0);
		p.moveTo(first.x, first.y);

		for (Point2D.Double d : polygon) {
			p.lineTo(d.x, d.y);
		}

		p.lineTo(first.x, first.y);

		p.closePath();

		return p.contains(point);

	}
}
